package cn.com.bod.fas.common.mq;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * @description mq消息执行器
 * @author zhangchi
 * @date 2019年10月08日 17:16:27
 * @version 1.0.0
 * @Copyright (c) scfhdt
 */
//@Component
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MqMessageExecutor {

    //处理器集合
    private List<MqMessageHandler> handlerList = new ArrayList<>();
    
    /**
     * @description 构造执行器
     * @author zhangchi
     * @date 2019年10月08日 17:15:48
     * @param  
     * @return cn.com.scfhdt.loanflow.mq.MqMessageExecutor 
     */
    public static MqMessageExecutor newExecutor() {
        return new MqMessageExecutor();
    }
    
    /**
     * @description 构造执行器
     * @author zhangchi
     * @date 2019年10月08日 17:18:10
     * @param list 
     * @return cn.com.scfhdt.loanflow.mq.MqMessageExecutor 
     */
    public static MqMessageExecutor newExecutor(List<MqMessageHandler> list) {
        return new MqMessageExecutor(list);
    }

    /**
     * @description 添加处理器
     * @author zhangchi
     * @date 2019年10月08日 10:52:58
     * @param handler 
     * @return void 
     */
    public MqMessageExecutor submit(MqMessageHandler handler) {
        handlerList.add(handler);
        return this;
    }

    /**
     * @description 处理器排序
     * @author zhangchi
     * @date 2019年10月08日 10:52:35
     * @param  
     * @return void 
     */
    private void sort(String message) {
        handlerList.sort((h0, h1) -> h0.order(message) - h1.order(message));
    }

    /**
     * @description 执行数据处理
     * @author zhangchi
     * @date 2019年10月08日 10:52:03
     * @param message 消息文本
     * @return
     */
    public void execute(String message) {
        this.sort(message);
        handlerList.stream()
                .filter(item -> item.effect(message))
                .forEach(handler -> handler.handle(message));
    }

}
